package com.company._1class;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestClass {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {

        // 普通方式
        Person p = new Person();
        p.setName("张三");
//        p.setAge(18);
        p.work();

        // 反射方式

        // 得到类对象
        // 方式1
//        Class c = Class.forName("com.company._1class.Person");
        //  方式2
//        Class c2 = p.getClass();
        // 方式3
//        Class c3 = Person.class;

        // 1 得到类对象
        Class c = Class.forName("com.company._1class.Person");
        // 2. 通过类对象创建该类对象
        Person p2 =(Person)c.newInstance();

        // 3. 用反射的方式操作属性
        Field f = c.getDeclaredField("age");
        f.setAccessible(true);
        f.set(p2,20);

        // 4. 用反射的方式调用方法
        Method m = c.getDeclaredMethod("work",new Class[]{});
        m.invoke(p2);


    }
}
